package river_city_ransom.services;

import exceptions.ComposantError;
import river_city_ransom.types.Commande;
import river_city_ransom.types.EtatPartie;

public interface MoteurJeu {
	/** _________________________________________________________ OBSERVATORS */
	public GestionCombat gestion();
	public EtatPartie resultatPartie();
	public boolean partieTerminee();
	
	/** ________________________________________________________ CONSTRUCTORS */
	// pre init(t) require  t != NULL
	// post gestion(init(t)) = GestionCombat::init(t)
	public void init(Terrain t) throws ComposantError;
	
	/** __________________________________________________________ INVARIANTS */
	// partieTerminee(M) = resultatPartie(M) != EN_COURS
	// resultatPartie(M) =	{ VICTOIRE si Personnage::estVaincu(gestion(M)::slick(M))
	//							  ^ (!Personnage::estVaincu(gestion(M)::alex(M))
	//								 v !Personnage::estVaincu(gestion(M)::ryan(M)))
	//						{ NUL si Personnage::estVaincu(gestion(M)::slick(M))
	//						^ Personnage::estVaincu(gestion(M)::alex(M))
	//						^ Personnage::estVaincu(gestion(M)::ryan(M))
	//						{ DEFAITE si !Personnage::estVaincu(gestion(M)::slick(M))
	//							 ^ Personnage::estVaincu(gestion(M)::alex(M))
	//							 ^ Personnage::estVaincu(gestion(M)::ryan(M))
	//						{ EN_COURS sinon
	
	
	/** ___________________________________________________________ OPERATORS */
	// pre calculerPasDeJeu(M, c1, c2) require !partieTerminee(M)
	// post gestion(calculerPasDeJeu(M, c1, c2)) = GestionCombat::gerer(M, c1, c2)
	public void calculerPasDeJeu(Commande commande1, Commande commande2) throws ComposantError;
}
